﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Linq;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DAL;
using BLL;
using Entities;
using NLog;

namespace QLTTTH
{
    public partial class UCPhanQuyen : DevExpress.XtraEditors.XtraUserControl
    {

        private Logger logger = LogManager.GetCurrentClassLogger();

        public UCPhanQuyen()
        {
            InitializeComponent();
        }

        private void UCPhanQuyen_Load(object sender, EventArgs e)
        {
            LoadDsPhanQuyen();
            btnLuu.Enabled = false;
            btnCapNhat.Enabled = false;
            btnXoaNhom.Enabled = false;
        }

        private void LoadDsPhanQuyen()
        {
            var phanQuyen = PhanQuyenManager.LayDanhSachPhanQuyen().Result;
            dgvPhanQuyen.DataSource = phanQuyen;
        }

        private void dgvPhanQuyen_Click(object sender, EventArgs e)
        {

            ResetCheckedListBox();
            btnLuu.Enabled = true;
            btnCapNhat.Enabled = true;
            btnXoaNhom.Enabled = true;
            var maNhomQuyen = int.Parse(grvPhanQuyen.GetFocusedRowCellValue("MaNhomQuyen").ToString());
            var nhomQuyen = NhomQuyenManager.LayNhomQuyen(maNhomQuyen);
            var dsQuyen = QuyenManager.LayDanhSachQuyen(maNhomQuyen).Result;

            if (nhomQuyen.Success)
            {
                groupPhanQuyen.Text = "Nhóm quyền " + nhomQuyen.Result.TenNhom;
            }

            foreach (var quyen in dsQuyen)
            {
                for (int i = 0; i < chkPhanQuyen.Items.Count; i++)
                {
                    if (chkPhanQuyen.Items[i].Value.ToString().Equals(quyen.TenQuyen))
                    {
                        chkPhanQuyen.SetItemChecked(i, true);
                        break;
                    }
                }
            }
        }


        private void ResetCheckedListBox()
        {
            for (int i = 0; i < chkPhanQuyen.Items.Count; i++)
            {
                chkPhanQuyen.SetItemChecked(i, false);
            }
        }

        private List<string> CheckQuyen()
        {
            var lst = new List<string>();
            for (int i = 0; i < chkPhanQuyen.Items.Count; i++)
            {
                if (chkPhanQuyen.GetItemChecked(i))
                {
                    lst.Add(chkPhanQuyen.GetItem(i).ToString());
                }
            }
            return lst;
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            try
            {
                var maNhom = int.Parse(grvPhanQuyen.GetFocusedRowCellValue("MaNhomQuyen").ToString());
                var quyen = CheckQuyen();
                var dsQuyen = QuyenManager.LayDanhSachQuyen().Result;

                for (int i = 0; i < dsQuyen.Count; i++)
                {
                    QuyenManager.CapNhatTrangThaiQuyen(maNhom, dsQuyen[i].TenQuyen, false);
                }

                foreach (var q in quyen)
                {
                    QuyenManager.CapNhatTrangThaiQuyen(maNhom, q, true);
                }
                XtraMessageBox.Show("Lưu thông tin phân quyền thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void Log(ActionResult aResult)
        {
            foreach (var ex in aResult.Exceptions)
            {
                logger.Error(ex);
            }
        }

        private void btnThemNhom_Click(object sender, EventArgs e)
        {
            logger.Info("Chọn chức năng thêm nhóm phân quyền");
            var frm = new frmThemNhom();
            frm.sendData = new frmThemNhom.SendData(ThemNhom);
            frm.ShowDialog();
        }

        private void ThemNhom(PhanQuyenInfo pq)
        {
            var nhomND = new NhomNguoiDung();
            nhomND.TenNhom = pq.TenNhom;
            nhomND.MoTa = pq.MoTa;
            var aResult = NhomNguoiDungManager.ThemNhomNguoiDung(nhomND);

            var nhomQuyen = new NhomQuyen();
            nhomQuyen.TenNhom = pq.TenNhom;
            nhomQuyen.MoTa = pq.MoTa;
            var bResult = NhomQuyenManager.ThemNhomQuyen(nhomQuyen);

            if (aResult.Success && bResult.Success)
            {
                var phanQuyen = new PhanQuyen();
                phanQuyen.MaNhomND = aResult.Result;
                phanQuyen.MaNhomQuyen = bResult.Result;
                phanQuyen.KichHoat = pq.TrangThai;
                var cResult = PhanQuyenManager.ThemPhanQuyen(phanQuyen);

                if (cResult.Success)
                {
                    XtraMessageBox.Show("Thêm nhóm phân quyền thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    ThemQuyen(bResult.Result);
                    this.LoadDsPhanQuyen();
                }
                else
                {
                    XtraMessageBox.Show("Thêm nhóm phân quyền không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Log(cResult);
                }
            }
        }

        private void ThemQuyen(int maNhom)
        {
            var dsQuyen = QuyenManager.LayDanhSachQuyen("admin").Result;
            foreach (var q in dsQuyen)
            {
                var quyen = new Quyen();
                quyen.MaNhomQuyen = maNhom;
                quyen.TenQuyen = q.TenQuyen;
                quyen.Active = false;
                QuyenManager.ThemQuyen(quyen);
            }
        }

        private void btnXoaNhom_Click(object sender, EventArgs e)
        {
            logger.Info("Chọn chức năng xóa nhóm quyền");

            if (XtraMessageBox.Show("Bạn có muốn xóa nhóm quyền này", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                try
                {
                    int maNhomND, maNhomQuyen;

                    int i = grvPhanQuyen.FocusedRowHandle;
                    if (grvPhanQuyen.IsRowSelected(i))
                    {
                        maNhomND = int.Parse(grvPhanQuyen.GetRowCellDisplayText(i, "MaNhomNguoiDung").ToString());
                        maNhomQuyen = int.Parse(grvPhanQuyen.GetRowCellDisplayText(i, "MaNhomQuyen").ToString());
                        var dsQuyen = QuyenManager.LayDanhSachQuyen("admin").Result;

                        foreach (var q in dsQuyen)
                        {
                            if (!QuyenManager.XoaQuyen(maNhomQuyen, q.TenQuyen).Success)
                            {
                                XtraMessageBox.Show("Xóa quyền không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                        }

                        if (!PhanQuyenManager.XoaPhanQuyen(maNhomND, maNhomQuyen).Success)
                        {
                            XtraMessageBox.Show("Xóa phân quyền không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }

                        if (!NhomNguoiDungManager.XoaNhomNguoiDung(maNhomND).Success)
                        {
                            XtraMessageBox.Show("Xóa nhóm người dùng không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }

                        if (!NhomQuyenManager.XoaNhomQuyen(maNhomQuyen).Success)
                        {
                            XtraMessageBox.Show("Xóa nhóm quyền không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }

                        XtraMessageBox.Show("Xóa nhóm quyền thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
                catch
                {
                    XtraMessageBox.Show("Xóa nhóm quyền không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

                grvPhanQuyen.DeleteSelectedRows();
            }
        }

        private void btnCapNhatNhom_Click(object sender, EventArgs e)
        {
            logger.Info("Chọn chức năng cập nhật nhóm quyền");

            var frm = new frmThemNhom();
            frm.Text = "Cập nhật thông tin nhóm";
            frm.FillControl(GetNhomQuyenListView());
            frm.sendData = new frmThemNhom.SendData(CapNhatNhomQuyen);
            frm.ShowDialog();
        }

        private void CapNhatNhomQuyen(PhanQuyenInfo pq)
        {
            var nhomND = new NhomNguoiDung();
            nhomND.MaNhomND = pq.MaNhomNguoiDung;
            nhomND.TenNhom = pq.TenNhom;
            nhomND.MoTa = pq.MoTa;
            var aResult = NhomNguoiDungManager.CapNhatNhomNguoiDung(nhomND);

            var nhomQuyen = new NhomQuyen();
            nhomQuyen.MaNhomQuyen = pq.MaNhomQuyen;
            nhomQuyen.TenNhom = pq.TenNhom;
            nhomQuyen.MoTa = pq.MoTa;
            var bResult = NhomQuyenManager.CapNhatNhomQuyen(nhomQuyen);

            if (aResult.Success && bResult.Success)
            {
                XtraMessageBox.Show("Cập nhật thông tin nhóm quyền thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                grvPhanQuyen.SetFocusedRowCellValue("TenNhom", pq.TenNhom);
                grvPhanQuyen.SetFocusedRowCellValue("MoTa", pq.MoTa);
                grvPhanQuyen.SetFocusedRowCellValue("TrangThai", pq.TrangThai);
            }
            else
            {
                XtraMessageBox.Show("Cập nhật thông tin nhóm quyền không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Log(aResult);
                Log(bResult);
            }


        }

        private PhanQuyenInfo GetNhomQuyenListView()
        {
            var nq = new PhanQuyenInfo();
            nq.MaNhomNguoiDung = int.Parse(grvPhanQuyen.GetFocusedRowCellValue("MaNhomNguoiDung").ToString());
            nq.MaNhomQuyen = int.Parse(grvPhanQuyen.GetFocusedRowCellValue("MaNhomQuyen").ToString());
            nq.TenNhom = grvPhanQuyen.GetFocusedRowCellValue("TenNhom").ToString();
            nq.MoTa = grvPhanQuyen.GetFocusedRowCellValue("MoTa").ToString();
            nq.TrangThai = (bool)grvPhanQuyen.GetFocusedRowCellValue("TrangThai");

            return nq;
        }


    }
}
